//doc.houdunren.com 学习网站

//正则表达式需要转义的字符  要匹配原始字符，必须要转义
// $-- -> \$
// (---> \(  
// )-- -> \)
// * ---> \*
// + ---> \+  
// . -- -> \.
// [---> \[
// ]-- -> \]
// ? ---> \?
// \ ---> \\
// / ---> \/  
// ^ ---> \^
// { -- -> \{
// } ---> \}  

//正则表达式

// let qaxs = "abc1j2k3j4"
// console.log(qaxs.replace(/\d/g, "替换"));//abc替换j替换k替换j替换

// let qwsw = "abc1j2k3j4"
// console.log(qwsw.replace(/\d/g, (str) => {
//   console.log(str);
//   return "后盾人"
// }));//abc后盾人j后盾人k后盾人j后盾人

// let named = 'aaa bbb ccc';
// let uw = named.replace(/\b\w+\b/g, function (word) {
//   console.log(word);
//   return word.substring(0, 1).toUpperCase() + word.substring(1);
// }
// );
// console.log(uw);//Aaa Bbb Ccc


// let ds = "u"
// //字面量表达式不能操作变量(ds)
// console.log(/ds/g.test("ustd"));


// let hds = "jdjdjhfhhgdg12k3j3u4h5kj9d6f5g"
// //使用字面量/\d/g创建正则表达式 (推荐使用match)
// console.log(hds.match(/\d/g).join(""));//123345965


// let hd = "jdjdjhfhhgdg12k3j3u4h5kj9d6f5g"
// //matchAll返回的是可迭代迭代器[[],[],[]] 需要用for of遍历 (不推荐使用matchAll暂时没有看到它的优势,用法复杂)
// for (let item of hd.matchAll(/\d/g)) {
//   console.log(item, 6320);
// }


// let sd = "hounmj"
// let qs="u"
// //使用eval操作变量
// console.log(eval(`/${qs}/`).test(sd)); //


// let hs = "ho3udun1ren2"
// let a = "u"
// //let a = /\d/
// //使用对象new RegExp创建正则表达式(可以操作变量)
// let reg = new RegExp(a, "g")
// console.log(reg.test(hs));


// let hou = "houdunren"
// console.log(/k|&/g.test(hou));
// let tel = "010-9999999"
// console.log(/^(010|020)-\d{7,8}$/g.test(tel));


// let reg = /[1234]/g //[123]表示一个字符，1或2或3和(1|2|3)是一样效果
// let jd = "23456"
// console.log(jd.match(reg));


// let kd = "23.34"
// //.在正则中表示除换行外任何字符,如果需要匹配普通.需要用\.
// let ss = /\d+\.\d+/
// console.log(ss.test(kd));//true
// console.log("\d" === "d", "\d+\.\d+", "/\\d+\\.\\d+/");//true d+.d+ /\d+\.\d+/
// let de = "23.34"
// //let red = new RegExp(ss, "g")
// let red = new RegExp("\\d+\\.\\d+", "g")
// console.log(red.test(de))
// let url = "https://www.baidu.com"
// console.log(/^https?:\/\/\w+\.\w+\.\w+$/g.test(url));


// let jdh = "3"
// // console.log(jdh.match(/\d/g));
// console.log(/^\d+$/g.test(jdh));


// let jhd = `
// houdunren.com
// jdhflk
// `
// console.log(jhd.match(/.+/));//["houdunren.com", index: 1, input: "↵houdunren.com↵jdhflk↵", groups: undefined]  //遇到换行符就停了


//如何匹配所有字符：/[\d\D]+/g，/[\s\S]+/g，/[\w\W]+/g等等类似这种，/(\d|\D)+/g,/(\s|\S)+/g等等也可以,还有/.+/gs这个也可以
// let jshd = `

//  houdunren.com
//  jdhflk
// `
// console.log(jshd.match(/.+/gs));//结果[ '\n\n houdunren.com\n jdhflk\n' ]，s相当于单行(过滤掉换行符)  // 正则/.+/gs匹配所有字符
// console.log(jshd.match(/[\d\D]+/gs)); //结果也是['\n\n houdunren.com\n jdhflk\n']

// let nub = "010 - -88888"
// console.log(nub.match(/\d+ - -88888/));//空格在正则中就是空格，它和abc这种字符一样，不需要加转义\


// let nub = "010 - -77777"
// console.log(nub.match(/^\d+\s-\s-\d{5}$/));//\s表示（空格，tab，换行符等）


//m多行匹配的用法
// let ssd = ` 
//  #1 js,200 #
//  #2 php,300 #
//  #3 houdunren.com # 后盾人
//  #4 node.js,300 #
// `;
// console.log(ssd.match(/^\s*#\d+\s+.+\s+#$/gm));

// console.log(ssd.match(/(\d|\D)+/g));
// let lesson = ssd.match(/^\s*#\d+\s+.+\s+#$/gm).map(item => {
//   let vn = item.replace(/\s*#\d+\s+/, "").replace(/\s+#/, "")
//   let [name, price] = vn.split(",")
//   return { name, price }
// })
// console.log(lesson);


// 汉字与字符属性u的用法  具体详细用法看15节视频(具体使用场景可能较少)
// let hda = "houdunren2010.12,36不断发展"
// console.log(hda.match(/\p{L}/gu));//L代表字母汉字  结果是['h', 'o', 'u','d', 'u', 'n','r', 'e', 'n',  '不', '断', '发','展']

// console.log(hda.match(/\p{P}/gu));//P表示标点符号  结果是[ '.', ',' ]
// console.log(hda.match(/\p{sc=Han}/gu));//sc=Han表示汉字  结果是[ '.', ',' ]


//lastIndex的作用(必须使用全局模式g)(具体使用场景可能较少)
// let sdas = "hou-dunren"
// let reg = /\w/g
// console.log(reg.lastIndex);
// console.log(reg.exec(sdas));
// console.log(reg.lastIndex);
// console.log(reg.exec(sdas));
// let res=null
// while (res = reg.exec(sdas)) {
//   console.log(res);
// }


//原子表的使用[]  原子组的使用() 
// let qwes = "2022-02-10"
// console.log(/^[1-9]\d{3}([-\/])\d{2}\1\d{2}$/g.test(qwes));


//排除匹配[^]
// let asdgd = "sjdhhf12321"
// console.log(asdgd.match(/[^\d]/g));//[ 's', 'j', 'd', 'h', 'h', 'f' ]

// console.log(asdgd.match(/[^\d]+/g));//[ 'sjdhhf' ]
// let xcvd = `张山:010-22522+,李四:020-5522+`
// console.log(xcvd.match(/[^:\d-,+]/g));//[ '张', '山', '李', '四' ]
// console.log(xcvd.match(/[^:\d-,+]+/g));//[ '张山', '李四' ]
// console.log(xcvd.match(/\p{sc=Han}+/gu));//[ '张山', '李四' ]


//原子表不解析
// let gdf = `(houdunren).
//   + `
// console.log(gdf.match(/[()]/g));//['(', ')']
// console.log(gdf.match(/[.+]/g));//[ '.', '+' ]
// console.log(gdf.match(/.+/g));//[ '(houdunren).', '  + ' ]
// console.log(gdf.match(/[\d\D]+/g));//[ '(houdunren).\n  + ' ]


//原子组的使用
// let ssdzx = `<h1>houdunren</h1>
// <h2>hdms</h2>
// `
// let reg = /<(h[1-6])>([\s\S]*)<\/\1>/i
// console.log(ssdzx.match(reg));
// console.log(ssdzx.match(reg)[0]);//<h1>houdunren</h1>
// console.log(ssdzx.match(reg)[1]);//h1
// console.log(ssdzx.match(reg)[2]);//houdunren
// console.log(ssdzx.match(reg).index);//0
// console.log(ssdzx.match(reg).input);//结果就是ssdzx


//原子组完成替换 
// let sudj = `
// <h1>houdunren</h1>
// <span>后盾人</span>
// <h2>hsjd</h2>
// `
// let reg = /<(h[1-6])>(\w([\s\S]+))<\/\1>/gi
// console.log(sudj.replace(reg, `<p>$2</p>`));//$1,$2是表示的匹配的第一个，第二个小括号里的内容
// let ssw = sudj.replace(reg, (p0, p1, p2, p3, p4, p5) => {
//   //p0表示正则匹配的内容
//   //p1, p2, p3是表示的匹配的第一个，第二个，第三个小括号里的内容 p4正则匹配到的每段字符的第一个字符的索引 p5就是sudj
//   console.log(p0, p1, p2, p3, p4, p5);
//   return `<p>p2</p>`
// })
// console.log(ssw, sudj[0], sudj[1]);


//不记录分组?: 有了?:意思是不能获取对应的\1，\2，$1，$2的值(可以删除看看有什么不同)
//matchAll和exec的使用场景获取正则中某部分的内容
// let ter = `
// https://www.google.com
// http://houdunren.com
// https://hsgd.com
// `
// let reg = /https?:\/\/((?:\w+\.)?\w+\.(?:com|cn|org))/ig
// console.log(ter.match(reg));
// //第一种方法
// let result = ter.matchAll(reg)
// let resd=[]
// for (const item of result) {
//   resd.push(item[1])
//   console.log(item,321000);
// }
// console.log(resd, 500);
// //第二种方法
// let ressd = []
// let res=null
// while (res = reg.exec(ter)) {
//   ressd.push(res[1])
// }
// console.log(ressd, 1000);


//电话号匹配
// let tel = "0100-9999999"
// console.log(tel.match(/^0\d{2,3}-\d{7,8}$/));


//+,*,{} ?贪婪匹配和禁止贪婪看28节和32节视频


// let gds = `
// https://www.google.com
// http://jshdhf.com
// http://sina.com.cn
// `
// let reg = /https?:\/\/((?:\w+\.)?(?:\w+\.)+(?:com|org|cn|cc))/ig
// let result = gds.matchAll(reg)
// let lists=[]
// for (const iterator of result) {
//   lists.push(iterator[1])
// }
// console.log(lists);


//split方法参数是正则
// let set = "2022-08-01"
// console.log(set.split(/[-\/]/));


//原子组别名?<xxx>
// let gds = `
// <h1>123</h1>
// <div>45661</div>
// <h2>741</h2>
// `
// const reg = /<(h[1-6])>(?<con>[\s\S]*?)<\/\1>/ig
// console.log(gds.replace(reg, "<h4>$<con></h4>"));


//使用原子组别名优化正则(别名内容会自动放入groups属性中，推荐使用)
let agsf = `
<a href="http://www.hdcms.com">hdcms</a>
<a href="http://www.houdunren.com">后盾人</a>
<a href="http://www.sina.com.cn">新良</a>
`
let reg = /=(['"])(?<link>.*)\1>(?<title>[\w\W]*?)</ig
let lists = []
while (res = reg.exec(agsf)) {
  console.log(res, 123);
  lists.push(res["groups"])
}
console.log(res, 456);





//断言匹配(只是正则的限制条件而不是正则的一部分)  (?=xxx)，(?<=xxx)，(?!xxx)，(?<!xxx)
//后断言匹配(?=xxx),exp1(?=exp2)：查找exp1后面是exp2的exp1)
// let shdg = "后盾人sjdghgdg后盾人aaaa"
// console.log(shdg.replace(/后盾人(?=aaaa)/g, "$&-"));//后盾人sjdghgdg后盾人-aaaa


//使用断言示例
// let sfd = `
// 200元，300次
// 300.00元，180
// 180，500
// `
// let reg = /(\d+)(\.00)?(?=元)/gi
// let result=sfd.replace(reg, (v,...args) => {
//   console.log(args);
//   args[1] = args[1]||".00"
//   return args.slice(0,2).join("")
// })
// console.log(result);


//前断言匹配(?<=xxx) (?<=exp2)exp1：查找 exp1前面是exp2的exp1
// let sgd = "houdunren789hsms123"
// let reg1 = /(?<=houdunren)\d+/ig
// console.log(sgd.match(reg1));
// let afsd = `<a href="www.baidu.com">百度</a><a href="www.yahu.com">雅虎</a>`
// let reg2 = /(?<=href=(['"])).+?(?=\1)/ig
// console.log(afsd.replace(reg2, "www.houdunren.com"));


//后断言匹配(?!xxx)  exp1(?!exp2)：查找后面不是 exp2 的 exp1
// let qew = "houdunren123hsms"
// let reg = /[a-z]+(?!\d+)$/ig
// console.log(qew.match(reg));


//前断言匹配(?<!xxx)  (?<!exp2)exp1：查找前面不是 exp2 的 exp1
// let rsf = "hdms123houdunren"
// let reg = /(?<!\d+)[a-z]+/
// console.log(rsf.match(reg));


//(?<!xxx)示例
// let sfsfd = `
// <a href="https://www.houdunren.com/1.jpg"></a>
// <a href="https://oss.houdunren.com/2.jpg"></a>
// <a href="https://cdn.houdunren.com/3.jpg"></a>
// <a href="https://houdunren.com/4.jpg"></a>
// `
// let reg = /https:\/\/\w+(?<!oss)\..+?(?=\/)/ig
// console.log(sfsfd.replace(reg, () => {
//   return "https://oss.houdunren.com"
// }));


